package com.xsp.mybatisxmlsqlparser.multidatabase;

/**
 * <p>
 *
 * </p>
 *
 * @author kylin
 * @since 2020-03-04
 **/
public interface DbCharacteristics {

    /**
     * 字段引号
     */
    String getColumnMark();

    /**
     * 默认schema
     *
     * @return
     */
    String getDefaultSchema();

    /**
     * 当前 DBType
     *
     * @return DbType
     */
    DataBasesTypeEnum getDbType();

    /**
     * Description: sysdate
     * Date: 2020/8/11 1:50 下午
     *
     * @param
     * @return java.lang.String
     */
    String sysdate();

    /**
     * Description: nvl
     * Date: 2020/8/11 1:50 下午
     *
     * @param a
     * @param b
     * @return java.lang.String
     */
    String nvl(String a, String b);

    /**
     * Description: nvl
     * Date: 2020/8/11 1:50 下午
     *
     * @param s s
     * @param a default value
     * @return nvl(s, a) as s
     */
    String nvlAlias(String s, String a);

    /**
     * Description: nvl
     * Date: 2020/8/11 1:50 下午
     *
     * @param s
     * @param a
     * @param alias 别名
     * @return nvl(s, a) as alias
     */
    String nvlAlias(String s, String a, String alias);

    /**
     * Description: nvl2
     * Date: 2020/8/11 1:50 下午
     *
     * @param s
     * @param a
     * @param b
     * @return java.lang.String
     */
    String nvl2(String s, String a, String b);

    /**
     * Description: substr
     * Date: 2020/8/11 1:50 下午
     *
     * @param a
     * @param b
     * @param c
     * @return java.lang.String
     */
    String substr(String a, int b, int c);

    /**
     * Description: to_char
     * Date: 2020/8/11 1:50 下午
     *
     * @param str
     * @param format
     * @return java.lang.String
     */
    String toChar(String str, String format);

    /**
     * Description: to_date
     * Date: 2020/8/11 1:50 下午
     *
     * @param str
     * @param format
     * @return java.lang.String
     */
    String toDate(String str, String format);

    /**
     * Description: to_number
     * Date: 2020/8/11 1:50 下午
     *
     * @param str
     * @return java.lang.String
     */
    String toNumber(String str);

    /**
     * Description: listagg
     * Date: 2020/8/11 1:50 下午
     *
     * @param str
     * @return java.lang.String
     */
    String listagg(String str);

    /**
     * Description: sys_guid
     * Date: 2020/8/11 2:00 下午
     *
     * @param
     * @return java.lang.String
     */
    String sysGuid();

    /**
     * 按日加减日期
     *
     * @param field 字段名 字段对应的数据类型为date
     * @param days  正数为后移，负数前移
     * @return
     */
    String plusDays(String field, int days);

    /**
     * 按日加减日期
     * <p>
     * 用于字符类型的字段，仅支持 yyyy-MM-dd格式的日期
     *
     * @param field 字段名或 文本日期，文本日期需要加单引号括住日期。 如A001044 或 '2001-01-01'
     * @param days  正数为后移，负数前移
     * @return
     */
    String plusDaysForVarchar(String field, int days);

    /**
     * 按月加减日期
     *
     * @param field  字段名 字段对应的数据类型为date
     * @param months 正数为后移月份，负数前移
     * @return
     */
    String plusMonths(String field, int months);

    /**
     * 按月加减日期
     * 正数为后移月份，负数前移
     * 用于字符类型的字段，format为类型
     *
     * @param field  字段名或 文本日期，文本日期需要加单引号括住日期。
     * @param months 正数为后移月份，负数前移
     * @param format 日期格式，使用java的日期格式，内部转换为不同数据库的格式化表达式  支持yyyy-MM-dd 或 yyyy-MM 两种日期格式
     * @return
     */
    String plusMonthsForVarcher(String field, int months, String format);

    /**
     * 转换java的日期时间类型到 对应的数据库的日期类型内
     * 转换内容有 yyyy MM dd HH mm ss
     *
     * @param javaDateTimeFormat
     * @return 返回当前数据库的日期格式字符串
     */
    String convJavaDateTimeFormatToDb(String javaDateTimeFormat);

    /**
     * 计算两个日期差
     *
     * @param field1
     * @param field2
     * @param format 日期格式，使用java的日期格式，内部转换为不同数据库的格式化表达式
     * @return 返回 用于计算field1-field2的结果的sql字符串  field1>field2时 实际运算结果为正数
     */
    String daysForVarcher(String field1, String field2, String format);
}
